package stubs;

import java.util.Iterator;
import java.util.LinkedList;

import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMFactory;
import org.apache.axiom.om.OMNamespace;
import org.apache.axis2.AxisFault;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.client.ServiceClient;
import java.lang.Integer;

import objetos.CategoriaObj;
import objetos.ProdutoObj;
import interfaces.Produto;

public class ProdutoStub implements Produto{

	@Override
	public boolean atualizarProduto(ProdutoObj produto) {
		
		try {
			// Cria Endpoint para envio do xml
			EndpointReference targetEPR = new EndpointReference(Bind.getServicesLocation() + "Produto/atualizarProduto");
			
			// Cria o arquivo xml
			OMElement payload = produto.toOMElement();
			
			// Cria servico do cliente
			ServiceClient sc = new ServiceClient();
			
			// Cria opcoes do servico
			Options opt = new Options();
			opt.setTo(targetEPR);
			sc.setOptions(opt);
			
			// Envia e recebe resposta
			OMElement res;
			
			res = sc.sendReceive(payload);
			
			return Boolean.parseBoolean(res.getText());
			
		} catch (AxisFault e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return false;
	}

	@Override
	public LinkedList<CategoriaObj> buscarCategoriaDoProduto(ProdutoObj produto) {

		try {
			// Cria Endpoint para envio do xml
			EndpointReference targetEPR = new EndpointReference(Bind.getServicesLocation() + "Produto/buscarCategoriaDoProduto");
			
			OMElement payload = produto.toOMElement();
			
			// Cria servico do cliente
			ServiceClient sc = new ServiceClient();
			
			// Cria opcoes do servico
			Options opt = new Options();
			opt.setTo(targetEPR);
			sc.setOptions(opt);
			
			// Envia e recebe resposta
			OMElement res;
			
			res = sc.sendReceive(payload);
			
			Iterator<OMElement> it = res.getChildElements();
			LinkedList<CategoriaObj> categorias = new LinkedList<CategoriaObj>();
			CategoriaObj categoria = new CategoriaObj();
			
			while (it.hasNext()) {
				categoria.loadOMElement(it.next());
				categorias.add(categoria);
			}
			
			return categorias;
			
		} catch (AxisFault e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return null;
	}

	@Override
	public ProdutoObj buscarProdutoPorId(int id) {
		try {
			ProdutoObj produto = new ProdutoObj();
			
			// Cria Endpoint para envio do xml
			EndpointReference targetEPR = new EndpointReference(Bind.getServicesLocation() + "Produto/buscarProdutoPorId");
			
			// Cria arquivo xml
			OMFactory factory = OMAbstractFactory.getOMFactory();
			OMNamespace ns_element = factory.createOMNamespace("atributo", "atb");
			OMElement payload = factory.createOMElement("id", ns_element);
			payload.setText(new Integer(id).toString());
			
			// Cria servico do cliente
			ServiceClient sc = new ServiceClient();
			
			// Cria opcoes do servico
			Options opt = new Options();
			opt.setTo(targetEPR);
			sc.setOptions(opt);
			
			// Envia e recebe resposta
			OMElement res;
			
			res = sc.sendReceive(payload);
			produto.loadOMElement(res);
			
			return produto;
			
		} catch (AxisFault e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return null;
		
	}

	@Override
	public LinkedList<ProdutoObj> buscarProdutosPorCategoria(
			LinkedList<ProdutoObj> produtos, String categoriaProduto) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public LinkedList<ProdutoObj> buscarProdutosPorMarca(
			LinkedList<ProdutoObj> produtos, String marcaProduto) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public LinkedList<ProdutoObj> buscarProdutosPorMarca(String marcaProduto) {
		try {
			
			// Cria Endpoint para envio do xml
			EndpointReference targetEPR = new EndpointReference(Bind.getServicesLocation() + "Produto/buscarProdutosPorMarca");
			
			OMFactory factory = OMAbstractFactory.getOMFactory();
			OMNamespace ns_element = factory.createOMNamespace("atributo", "atb");
			OMElement payload = factory.createOMElement("nome", ns_element);
			payload.setText(marcaProduto);
			
			// Cria servico do cliente
			ServiceClient sc = new ServiceClient();
			
			// Cria opcoes do servico
			Options opt = new Options();
			opt.setTo(targetEPR);
			sc.setOptions(opt);
			
			// Envia e recebe resposta
			OMElement res;
			
			res = sc.sendReceive(payload);
			
			Iterator<OMElement> it = res.getChildElements();
			LinkedList<ProdutoObj> produtos = new LinkedList<ProdutoObj>();
			
			while (it.hasNext()) {
				ProdutoObj produto = new ProdutoObj();
				produto.loadOMElement(it.next());
				produtos.add(produto);
			}
			
			return produtos;
			
		} catch (AxisFault e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return null;
	}

	@Override
	public LinkedList<ProdutoObj> buscarProdutosPorNome(
			LinkedList<ProdutoObj> produtos, String nomeProduto) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public LinkedList<ProdutoObj> buscarProdutosPorNome(String nomeProduto) {
		
		try {
			// Cria Endpoint para envio do xml
			EndpointReference targetEPR = new EndpointReference(Bind.getServicesLocation() + "Produto/buscarProdutosPorNome");
			
			OMFactory factory = OMAbstractFactory.getOMFactory();
			OMNamespace ns_element = factory.createOMNamespace("atributo", "atb");
			OMElement payload = factory.createOMElement("nome", ns_element);
			payload.setText(nomeProduto);
			
			// Cria servico do cliente
			ServiceClient sc = new ServiceClient();
			
			// Cria opcoes do servico
			Options opt = new Options();
			opt.setTo(targetEPR);
			sc.setOptions(opt);
			
			// Envia e recebe resposta
			OMElement res;
			
			res = sc.sendReceive(payload);
			
			Iterator<OMElement> it = res.getChildElements();
			LinkedList<ProdutoObj> produtos = new LinkedList<ProdutoObj>();
			
			while (it.hasNext()) {
				ProdutoObj produto = new ProdutoObj();
				produto.loadOMElement(it.next());
				produtos.add(produto);
			}
			
			return produtos;
			
		} catch (AxisFault e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return null;
	}

	@Override
	public LinkedList<ProdutoObj> buscarProdutosPorPreco(
			LinkedList<ProdutoObj> produtos, float precoMenorProduto,
			float precoMaiorProduto) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public LinkedList<ProdutoObj> buscarProdutosPorPreco(
			float precoMenorProduto, float precoMaiorProduto) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public boolean cadastrarProduto(ProdutoObj produto) {
		
		try {
			// Cria Endpoint para envio do xml
			EndpointReference targetEPR = new EndpointReference(Bind.getServicesLocation() + "Produto/cadastrarProduto");
			
			// Cria o arquivo xml
			OMElement payload = produto.toOMElement();
			
			// Cria servico do cliente
			ServiceClient sc = new ServiceClient();
			
			// Cria opcoes do servico
			Options opt = new Options();
			opt.setTo(targetEPR);
			sc.setOptions(opt);
			
			// Envia e recebe resposta
			OMElement res;
			
			res = sc.sendReceive(payload);
			
			return Boolean.parseBoolean(res.getText());
			
		} catch (AxisFault e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return false;
		
	}

	@Override
	public boolean desativarProduto(int codigoProduto) {
		
		try {
			
			// Cria Endpoint para envio do xml
			EndpointReference targetEPR = new EndpointReference(Bind.getServicesLocation() + "Produto/desativarProduto");
			
			// Cria elemento
			OMFactory factory = OMAbstractFactory.getOMFactory();
			OMNamespace ns_element = factory.createOMNamespace("atributos", "atb");
			OMElement payload = factory.createOMElement("codigo", ns_element);
			
			payload.setText(new Integer(codigoProduto).toString());
			
			// Cria servico do cliente
			ServiceClient sc = new ServiceClient();
			
			// Cria opcoes do servico
			Options opt = new Options();
			opt.setTo(targetEPR);
			sc.setOptions(opt);
			
			// Envia e recebe resposta
			OMElement res;
			
			res = sc.sendReceive(payload);
			
			return Boolean.parseBoolean(res.getText());
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return false;
	}
}
